#include <iostream>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/types.h>
#include <sys/wait.h>

using namespace std;

void Printpending(sigset_t pending)
{
    for(int i = 31; i>=1; i--)
    {
        if(sigismember(&pending,i))
        {
            cout << "1";
        }
        else 
        {
            cout << "0";
        }
    }
    cout << endl;
}

int main()
{
    sigset_t nset,oset;
    //首先初始化
    sigemptyset(&nset);
    sigemptyset(&oset);
    //然后在将2号信号添加到指定的信号集中
    sigaddset(&nset,2);
    //然后设置信号屏蔽字为nset所指向的值
    sigprocmask(SIG_SETMASK,&nset,&oset);//这个时候就把2号信号屏蔽了

    sigset_t pending;
    int cnt = 0;
    while(true)
    {
        int n = sigpending(&pending);
        if(n < 0) continue;
        //打印信号集
        Printpending(pending);
        cnt++;
        sleep(1);
        //解除屏蔽
        if(cnt == 10)
        {
            sigprocmask(SIG_SETMASK,&oset,nullptr);//解除屏蔽
        }
    }

    return 0;
}


// void myhander(int signo)
// {
//     cout << " a signo get " << signo << endl;
// }

// int main()
// {
//     // signal(2,myhander);
//     // int a = 1;
//     // int b = 0;
//     // a /= b;

//     pid_t id = fork();
//     if(id == 0)
//     {
//         //child
//         int cnt = 50;
//         while(cnt--)
//         {
//             cout << "i am a child process my pid : " << getpid() << endl;
//             sleep(1);
//         }
//         exit(0);
//     }
//     //father
//     int status = 0;
//     int rid = 0;
//     rid = waitpid(id,&status,0);
//     if(id == rid)
//     {
//         cout << "wait id sucess , rid = " << rid <<
//          " exit code = " << ((status>>8)&0xFF) <<
//           " exit signal = " << (status&0x7F) <<
//            " core dump = " << ((status>>7)&1) << endl; 
//     }
//     return 0;
// }
// void myhander(int signo)
// {
//     cout << "a signo get : " << signo <<endl;
//     int n = alarm(20);
//     cout << "上一个闹钟剩余时间 : " << n << endl;
// }

// int main()
// {
//     signal(14,myhander);
//     alarm(20);

//     while(true)
//     {
//         cout << "a process pid : " << getpid() << endl;
//         sleep(1);
//     }

//     return 0;
// }

// void myhander(int signo)
// {
//     cout << "a signo get : " << signo << endl;
//     sleep(1);
// }

// int main()
// {
//     // signal(11,myhander);
//     int* p = nullptr;
//     *p = 1;

//     return 0;
// }